package com.monkarapps.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.monkarapps.bean.Aplicacion;
import com.monkarapps.bean.Categoria;
import com.monkarapps.bean.Compra;
import com.monkarapps.bean.Sub_categoria;
import com.monkarapps.bean.Usuario;
import com.monkarapps.constants.Querys;
import com.monkarapps.service.AplicacionService;

public class AplicacionDAO implements AplicacionService{

	EntityManagerFactory emf=Persistence.createEntityManagerFactory("monkarapps");
	EntityManager em=emf.createEntityManager();
	
	
	@Override
	public List<Aplicacion> filtrarXSub_categoria(Sub_categoria sc) throws Exception {
              
              ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
              try {
                      em.getTransaction().begin();
                      Query q=em.createQuery(Querys.FILTRAR_APLICACIONES_X_SUB_CATEGORIA);
                      q.setParameter("sub_categoria",sc);
                      System.out.println(q);
                      @SuppressWarnings("rawtypes")
                      List lista=q.getResultList();
                      Aplicacion app;
                      for(int i=0;i<lista.size();i++){
                              app=(Aplicacion)lista.get(i);
                              apps.add(app);
                      }
                      em.getTransaction().commit();
              } catch (Exception e) {
                      // TODO: handle exception
                      e.printStackTrace();
                      em.getTransaction().rollback();
                      apps =null;
              }
                      return apps;
	}
	
	
	@Override
	public List<Aplicacion> listar(int cantidad) throws Exception {
              
              ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
              try {
                      em.getTransaction().begin();
                      Query q=em.createQuery(Querys.LISTAR_APLICACIONES);
//                      q.setFirstResult(firstPosition);
                      q.setMaxResults(cantidad);
                      System.out.println(q);
                      @SuppressWarnings("rawtypes")
                      List lista=q.getResultList();
                      Aplicacion app;
                      for(int i=0;i<lista.size();i++){
                              app=(Aplicacion)lista.get(i);
                              apps.add(app);
                      }
                      em.getTransaction().commit();
              } catch (Exception e) {
                      // TODO: handle exception
                      e.printStackTrace();
                      em.getTransaction().rollback();
                      apps =null;
              }
                      return apps;
	}
	
	
	@Override
	public List<Aplicacion> listarTopDescargas(int cantidad) throws Exception {
              ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
              try {
                      em.getTransaction().begin();
                      Query q=em.createQuery(Querys.LISTAR_APLICACIONES_TOP_DESCARGAS);
//                      q.setFirstResult(firstPosition);
                      q.setMaxResults(cantidad);
                      System.out.println(q);
                      @SuppressWarnings("rawtypes")
                      List lista=q.getResultList();
                      Aplicacion app;
                      for(int i=0;i<lista.size();i++){
                              app=(Aplicacion)lista.get(i);
                              apps.add(app);
                      }
                      em.getTransaction().commit();
              } catch (Exception e) {
                      // TODO: handle exception
                      e.printStackTrace();
                      em.getTransaction().rollback();
                      apps =null;
              }
                      return apps;
	}
	
	@Override
	public List<Aplicacion> listarTopNuevas(int cantidad) throws Exception {
              ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
              try {
                      em.getTransaction().begin();
                      Query q=em.createQuery(Querys.LISTAR_APLICACIONES_TOP_NUEVAS);
//                      q.setFirstResult(firstPosition);
                      q.setMaxResults(cantidad);
                      System.out.println(q);
                      @SuppressWarnings("rawtypes")
                      List lista=q.getResultList();
                      Aplicacion app;
                      for(int i=0;i<lista.size();i++){
                              app=(Aplicacion)lista.get(i);
                              apps.add(app);
                      }
                      em.getTransaction().commit();
              } catch (Exception e) {
                      // TODO: handle exception
                      e.printStackTrace();
                      em.getTransaction().rollback();
                      apps =null;
              }
                      return apps;
	}
	
	@Override
	public List<Aplicacion> listarTopValoradas(int cantidad) throws Exception {
              ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
              try {
                      em.getTransaction().begin();
                      Query q=em.createQuery(Querys.LISTAR_APLICACIONES_TOP_VALORADAS);
//                      q.setFirstResult(firstPosition);
                      q.setMaxResults(cantidad);
                      System.out.println(q);
                      @SuppressWarnings("rawtypes")
                      List lista=q.getResultList();
                      Aplicacion app;
                      for(int i=0;i<lista.size();i++){
                              app=(Aplicacion)lista.get(i);
                              apps.add(app);
                      }
                      em.getTransaction().commit();
              } catch (Exception e) {
                      // TODO: handle exception
                      e.printStackTrace();
                      em.getTransaction().rollback();
                      apps =null;
              }
                      return apps;
	}


	@Override
	public Aplicacion obtenerAplicacion(Aplicacion a) throws Exception {
		 ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
         try {
                 em.getTransaction().begin();
                 Query q=em.createQuery(Querys.OBTENER_APLICACION);
                 q.setParameter("idAplicacion", a.getIdAplicacion());
//                 q.setFirstResult(firstPosition);
                 q.setMaxResults(1);
                 System.out.println(q);
                 @SuppressWarnings("rawtypes")
                 List lista=q.getResultList();
                 Aplicacion app;
                 for(int i=0;i<lista.size();i++){
                         app=(Aplicacion)lista.get(i);
                         apps.add(app);
                 }
                 em.getTransaction().commit();
         } catch (Exception e) {
                 // TODO: handle exception
                 e.printStackTrace();
                 em.getTransaction().rollback();
                 apps =null;
         }
                 return apps.get(0);
                 
                 
	}


	@Override
	public List<Aplicacion> listarXUsuario(Usuario usuario) throws Exception {
		 ArrayList<Aplicacion> apps=new ArrayList<Aplicacion>();
         try {
                 em.getTransaction().begin();
                 Query q=em.createQuery(Querys.OBTENER_COMPRA_X_USUARIO);
                 q.setParameter("usuario", usuario.getIdUsuario());
                 @SuppressWarnings("rawtypes")
                 List lista=q.getResultList();
                 Compra compra;
                 for(int i=0;i<lista.size();i++){
                         compra=(Compra)lista.get(i);
                         apps.add(compra.getAplicacion());
                 }
                 em.getTransaction().commit();
         } catch (Exception e) {
                 // TODO: handle exception
                 e.printStackTrace();
                 em.getTransaction().rollback();
         }
                 return apps;
	}

}
